/*
 * 
 */
package mx.unam.acatlan.poo.practica2;


/**
 * @author Carlos Alegría Galicia
 *
 */
public class ImplementaciónDePilaGenérica <E> implements PilaGenérica<E> {
	
	/** El arreglo que contiene los elementos de esta pila */
	private E elementos[];
	
	/** La posición en {@link #elementos} que indica la cabeza de la pila */
	private int indice;
	
	/**
	 * Crea una {@link Pila} que puede almacenar el número de elementos
	 * especificado por <code>capacidad</code>.
	 * 
	 * @param capacidad El número máximo de elementos que puede almacenar la
	 *                  pila.
	 */
	/* La anotación @SuppressWarnings("unchecked") le indica al compilador que
	 * en este método, no debe hacer caso a expresiones donde normalmente
	 * lanzaría advertencias de verificación de tipo
	 */
	@SuppressWarnings("unchecked")
	public ImplementaciónDePilaGenérica(int capacidad) {
		this.elementos =  (E[]) new Object[capacidad];
		this.indice = 0;
	}
	
	/**
	 * Crea una {@link Pila} que puede almacenar hasta 10 elementos.
	 */
	public ImplementaciónDePilaGenérica() {
		this(10);
	}
	
	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.PilaGenérica#push(java.lang.Object)
	 */
	public void push(E elemento) {
		if (this.indice < this.elementos.length) {
			this.elementos[this.indice++] = elemento;
		}
	}

	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.PilaGenérica#pop()
	 */
	public E pop() {
		if (this.indice >= 0) {
			E elemento = this.elementos[--this.indice];
			this.elementos[this.indice] = null;
			
			return elemento;
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.PilaGenérica#tamaño()
	 */
	public int getTamaño() {
		return this.indice;
	}
	
	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.PilaGenérica#getCapacidad()
	 */
	public int getCapacidad() {
		return this.elementos.length;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		String cadena = "";
		if (this.indice > 0) {
			cadena = this.elementos[0].toString();
			for (int i = 0; i < this.indice; i++) {
				cadena += ", " + this.elementos[i];
			}
		}
		return "{" + cadena + "}";
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	}
}
